package com.x.动态代理.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * ClassName: TxAroundAdvice
 * Package: IntelliJ IDEA
 * Description:
 * Written by HanXu
 * Create 2024.09.04 21:16
 */
@Component
@Aspect
public class TxAroundAdvice {

    /**
     * 环绕通知，需要在通知中，定义目标方法的执行
     * 相当于一个代理
     *
     * @param joinPoint 获取目标方法的参数
     * @return 目标方法的返回值
     */

    @Around("com.x.动态代理.pointCut.pointCut.pc()") //环绕通知
    public Object transaction(ProceedingJoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();

        Object result = null;
        String simpleName = null;
        String name = null;

        try {
            simpleName = joinPoint.getTarget().getClass().getSimpleName();//方法所属类名
            name = joinPoint.getSignature().getName();//方法名

            //增强代码 --> @Before
            System.out.println("[方法所属类]:"+simpleName+", [方法]:"+name+" >>>>>>>>>>> 事务开始");

            result = joinPoint.proceed(args);

            //增强代码 --> @AfterReturning
            System.out.println("[方法所属类]:"+simpleName+", [方法]:"+name+" >>>>>>>>>>> 事务提交");
        } catch (Throwable e) {
            ////增强代码 --> @AfterThrowing
            System.out.println("[方法所属类]:"+simpleName+", [方法]:"+name+" >>>>>>>>>>> 事务开始");

            throw new RuntimeException(e);
        }

        return result;
    }
}
